using System;

class MyStack<T>
{
    public T[] Items; // 存储数据的数组
    private int top; // 栈顶指针
    private int capacity; // 栈的容量

    // 构造函数
    public MyStack(int i)
    {
        if (i <= 0)
        {
            throw new ArgumentException("栈的容量必须大于0");
        }
        capacity = i;
        Items = new T[capacity];
        top = -1; // 初始栈为空，栈顶指针为-1
    }

    // 初始化栈
    public void InitStack()
    {
        Items = new T[capacity];
        top = -1;
    }

    // 清空栈
    public void ClearStack()
    {
        top = -1; // 直接将栈顶指针设为-1，不需要实际清空数组元素
    }

    // 入栈
    public bool Push(T item)
    {
        if (top >= capacity - 1)
        {
            // 栈已满，入栈失败
            return false;
        }
        Items[++top] = item;
        return true;
    }

    // 出栈
    public T Pop()
    {
        if (top < 0)
        {
            // 栈为空，抛出异常
            throw new InvalidOperationException("栈为空，无法出栈");
        }
        return Items[top--];
    }

    // 判断栈是否为空
    public bool IsEmpty
    {
        get { return top < 0; }
    }

    // 判断栈是否已满
    public bool IsFull
    {
        get { return top >= capacity - 1; }
    }

    // 获取栈中元素个数
    public int Count
    {
        get { return top + 1; }
    }
}

// 主程序类，用于测试MyStack<T>类
class Program
{
    static void Main(string[] args)
    {
        // 创建一个容量为5的整数栈
        MyStack<int> intStack = new MyStack<int>(5);
        Console.WriteLine("初始化整数栈，容量为5");
        Console.WriteLine($"栈是否为空: {intStack.IsEmpty}");

        // 测试入栈操作
        Console.WriteLine("\n测试入栈操作:");
        for (int i = 1; i <= 6; i++)
        {
            bool result = intStack.Push(i * 10);
            Console.WriteLine($"入栈元素 {i * 10}: {(result ? "成功" : "失败，栈已满")}");
        }
        Console.WriteLine($"栈中元素个数: {intStack.Count}");

        // 测试出栈操作
        Console.WriteLine("\n测试出栈操作:");
        try
        {
            while (!intStack.IsEmpty)
            {
                int value = intStack.Pop();
                Console.WriteLine($"出栈元素: {value}");
            }
            // 尝试从空栈中出栈
            Console.WriteLine("尝试从空栈中出栈...");
            intStack.Pop();
        }
        catch (InvalidOperationException ex)
        {
            Console.WriteLine($"捕获异常: {ex.Message}");
        }

        // 测试清空栈
        Console.WriteLine("\n测试清空栈:");
        intStack.Push(100);
        intStack.Push(200);
        Console.WriteLine($"入栈两个元素后，栈中元素个数: {intStack.Count}");
        intStack.ClearStack();
        Console.WriteLine($"清空栈后，栈是否为空: {intStack.IsEmpty}");

        // 测试字符串类型的栈
        Console.WriteLine("\n测试字符串类型的栈:");
        MyStack<string> strStack = new MyStack<string>(3);
        strStack.Push("Hello");
        strStack.Push("World");
        strStack.Push("C#");
        Console.WriteLine($"字符串栈入栈完成，元素个数: {strStack.Count}");
        while (!strStack.IsEmpty)
        {
            Console.WriteLine($"出栈元素: {strStack.Pop()}");
        }

        // 保持控制台窗口打开
        Console.WriteLine("\n按任意键退出...");
        Console.ReadKey();
    }
}